// 测试链接 ：https://www.luogu.com.cn/problem/P3327
// 三个常用函数：元函数、常数函数、恒等函数
// 相关帖子 ：https://www.cnblogs.com/dx123/p/16905011.html
// 相关帖子 ：https://www.cnblogs.com/dx123/p/16968903.html
// 积性函数 ：https://oi-wiki.org/math/number-theory/basic/#%E7%A7%AF%E6%80%A7%E5%87%BD%E6%95%B0
// 欧拉函数 ：https://oi-wiki.org/math/number-theory/euler-totient/
// 数论分块 ：https://oi-wiki.org/math/number-theory/sqrt-decomposition/
// 狄利克雷卷积 ：https://oi-wiki.org/math/poly/dgf/
// 莫比乌斯反演 ：https://oi-wiki.org/math/number-theory/mobius/
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

#define ll long long
const int MAXN = 50001;
int cnt;
int mu[MAXN];
int prime[MAXN];
bool visited[MAXN];
ll F[MAXN];

void init()
{
    mu[1] = 1;
    for(int i = 2; i < MAXN; ++i)
    {
        if(!visited[i])
        {
            prime[++cnt] = i;
            mu[i] = -1;
        }
        for(int j = 1; i * prime[j] < MAXN; ++j)
        {
            visited[i * prime[j]] = true;
            if(i % prime[j] == 0) break;
            mu[i * prime[j]] = -mu[i];
        }
    }
    for(int i = 1; i < MAXN; ++i) mu[i] += mu[i - 1];
    for(int i = 1; i < MAXN; ++i)
    {
        for(int l = 1, r; l <= i; l = r + 1)
        {
            r = i / (i / l);
            F[i] += 1LL * (r - l + 1) * (i / l);
        }
    }
}

ll compute(int n, int m)
{
    if(n > m) swap(n, m);
    ll ans = 0;
    for(int l = 1, r; l <= n; l = r + 1)
    {
        r = min(n / (n / l), m / (m / l));
        ans += (mu[r] - mu[l - 1]) * F[n / l] * F[m / l];
    }
    return ans;
}

int main()
{
    init();
    int t, n, m;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d", &n, &m);
        printf("%lld\n", compute(n, m));
    }

    return 0;
}